package persistencia.busqueda;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import negocio.busqueda.EstudioPerfil;
import negocio.busqueda.Perfil;
import negocio.cv.TipoExigencia;
import persistencia.DACBase;
import persistencia.DACNivel;
import persistencia.SingletonDACBase;
import persistencia.cliente.DACCondicion;
import persistencia.cliente.DACInstitucion;
import persistencia.cliente.DACTipoEstudio;
import persistencia.cliente.DACTitulo;

public class DACEstudioPerfil extends DACBase {
	
	
	private EstudioPerfil estudio;
	private List<EstudioPerfil> estudios;
	private CallableStatement clstm;
	private ResultSet rs;
	

	
	public DACEstudioPerfil(DACBase dacBase) {
		super(dacBase);
		// TODO Auto-generated constructor stub
	}

	/**
	 * Estos metodos actualizar toman la lista de objetos a modificar
	 * y crea a quellos que anteriormente no existian, modifica los que 
	 * ya exiatian y vuelven de nuevo
	 * y borra aquellos que fueron eliminados  
	 * @param perfil
	 */
	public void actualizarEstudiosPerfil(Perfil perfil) {		
		try{	
			 
			
			List<EstudioPerfil> estudiosAModificar = consultarEstudiosPerfil(perfil.getIdPerfil());
			
			
			for (EstudioPerfil estudio : perfil.getEstudiosRequeridos()) {
				
					clstm = getConn().prepareCall("{? = call save_estudioperfil(?,?,?,?,?,?,?,?)}");
					
					clstm.registerOutParameter(1,java.sql.Types.INTEGER);
					
					clstm.setInt("idestudioxperfil", estudio.getIdEstudioPerfil());
					clstm.setInt("idperfil", perfil.getIdPerfil());
					clstm.setInt("idtipoestudio", estudio.getTipoEstudio().getIdTipoEstudio());
					clstm.setInt("idtitulo", estudio.getTitulo().getIdTitulo());
					clstm.setInt("idcondicion", estudio.getCondicion().getIdCondicion());
					clstm.setInt("idnivel", estudio.getNivel().getIdNivel());
					clstm.setInt("idinstitucion", estudio.getInstitucion().getIdInstitucion());
					if (estudio.getExcluyente()) {
						clstm.setString("excluyente", "S" );
					}
					else {
						clstm.setString("excluyente", "N" );
					}
					
					clstm.execute();	
					
					if (estudio.getIdEstudioPerfil() == 0) {
						estudio.setIdEstudioPerfil(clstm.getInt(1));
					}
					
					// si estaba en la lista de estudios a modificar lo borro
					//para que queden solo aquellas que se eliminaron
					// y si no estaba en la lsita es poreu era nuevo
					
					for (EstudioPerfil estudiomod : estudiosAModificar) {
						System.out.println(estudiomod.getTipoEstudio().getNombre()+"\n por cada save nombre de cada elementodel Amodificar");
					}
					int indice = estudiosAModificar.indexOf(estudio);
					System.out.println(indice +"\n indice del estudio que se esta actualizando "+ estudio.getTipoEstudio().getNombre()+" en el Amodificar");
					if (indice != -1){
						estudiosAModificar.remove(indice);
					}
					
					
										
					
				
					
			}
			
			for (EstudioPerfil estudio  :estudiosAModificar) {
				System.out.println("\n Antes de eliminar" + estudio.getIdEstudioPerfil() + estudio.getTipoEstudio().getNombre());
				
			}
			
			for (EstudioPerfil estudio  :estudiosAModificar) {
				eliminarEstudioDelPerfil(estudio);
			}
			
			if(clstm != null)
				clstm.close();
	        clstm = null;
	         
	                   
	        
		}
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo altaEstudioPerfil_DacEstudioPerfil");
		}	
	}
	
	
	
	public void eliminarEstudioDelPerfil(EstudioPerfil ep) {
		try{			
			clstm = getConn().prepareCall("{call delete_estudioperfil(?)}");						
			clstm.setInt("par_idestudioxperfil", ep.getIdEstudioPerfil());					
			clstm.execute();				         
	       
		}
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo eliminarEstudioPerfil_DacEstudioPerfil");
		}	
	}
	
	public List<EstudioPerfil> consultarEstudiosPerfil(int idPerfil){
		
		estudios = new ArrayList<EstudioPerfil>();
		try{
			clstm = getConn().prepareCall("{call estudioxperfilConsultarTodos(?)}");
			clstm.setInt("idperfil", idPerfil);
			clstm.execute();
			rs = clstm.getResultSet();			
			while (rs.next()) {
				
				estudio = new EstudioPerfil();
				
				estudio.setIdEstudioPerfil(rs.getInt("idestudioxperfil"));
				
				DACTipoEstudio dacTipoEstudio = new DACTipoEstudio(SingletonDACBase.tomarDACBase());
				estudio.setTipoEstudio(dacTipoEstudio.consultarTipoDeEstudio(
						rs.getInt("idtipoestudio")));
				
				DACTitulo dacTitulo = new DACTitulo(SingletonDACBase.tomarDACBase());
				estudio.setTitulo(dacTitulo.consultarTitulo(
						rs.getInt("idtitulo")));
				
				DACInstitucion dacInstitucion = new DACInstitucion(SingletonDACBase.tomarDACBase());
				estudio.setInstitucion(dacInstitucion.consultarIstitucion(
						rs.getInt("idinstitucion")));
				
				DACCondicion dacCondicion = new DACCondicion(SingletonDACBase.tomarDACBase());
				estudio.setCondicion(dacCondicion.consultarCondicion(
						rs.getInt("idcondicion")));
				
				DACNivel dacNivel = new DACNivel(SingletonDACBase.tomarDACBase());
				estudio.setNivel(dacNivel.consultarNivel(rs.getInt("idnivel")));
				
				if (rs.getString("excluyente").equals("S")) {
					estudio.setExcluyente(true);
				}
				else {
					estudio.setExcluyente(false);
				}
				
				estudios.add(estudio);				
            }			           

			rs.close();
			rs = null;
			clstm.close();
            clstm = null;
            
            
            
		}    
		catch (SQLException ex) {
		    // handle any errors
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo consultarEstudiosPerfil()_DacEstudioPerfil");
			}
		
	    return estudios;		
	}
	
	
}
